package com.hunttown.mes.service;

import com.hunttown.common.domain.Query;
import com.hunttown.mes.dao.TransportLoginWxDao;
import com.hunttown.mes.domain.TransportLoginWx;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.List;

/**
 * created by wangjunfu on 2021-02-25 10:59:04
 */
@Service
public class TransportLoginWxService {

    private final static Logger logger = LoggerFactory.getLogger(TransportLoginWxService.class);

    private final TransportLoginWxDao transportLoginWxDao;
    private final AHelpService helpService;

    @Autowired
    public TransportLoginWxService(TransportLoginWxDao transportLoginWxDao, AHelpService helpService) {
        this.transportLoginWxDao = transportLoginWxDao;
        this.helpService = helpService;
    }

    /**
     * 新增
     *
     * @param transportLoginWx 实体对象
     * @return 最新插入id
     */
    public TransportLoginWx insert(TransportLoginWx transportLoginWx) {
        //api接口传进来是有值的
        if (transportLoginWx.getEntId() == null)
            transportLoginWx.setEntId(helpService.getEnterpriseId());
        if (transportLoginWx.getCreateTime() == null)
            transportLoginWx.setCreateTime(new Date());
        if (transportLoginWx.getStopFlag() == null)
            transportLoginWx.setStopFlag(0);
        if (transportLoginWx.getDeleteFlag() == null)
            transportLoginWx.setDeleteFlag(0);

        return transportLoginWxDao.insert(transportLoginWx);
    }

    /**
     * 根据ID修改数据信息
     *
     * @param transportLoginWx 实体对象
     * @return True or False
     */
    public Boolean updateInfoById(TransportLoginWx transportLoginWx) {
        if (transportLoginWx.getEntId() == null) {
            transportLoginWx.setEntId(helpService.getEnterpriseId());
        }
        return transportLoginWxDao.updateInfoById(transportLoginWx);
    }

    /**
     * 根据Query修改数据信息
     *
     * @param query 需要修改的字段 KV 格式
     * @return True or False
     */
    public Boolean updateInfoByQuery(Query query) {
        if (!query.containsKey("w_entId")) {
            query.put("w_entId", helpService.getEnterpriseId());
        }
        return transportLoginWxDao.updateInfoByQuery(query);
    }

    /**
     * 根据ID获取记录信息
     *
     * @param id 主键id
     * @return 实体对象
     */
    public TransportLoginWx selectById(Integer id) {
        return transportLoginWxDao.selectById(id, helpService.getEnterpriseId());
    }

    /**
     * 根据query取出一条记录，但是可能有多条记录，取最新的一条。
     *
     * @param query 查询条件 KV 格式
     * @return 实体对象
     */
    public TransportLoginWx selectObjByQuery(Query query) {
        if (query == null || query.size() == 0) {
            return null;
        }
        if (!query.containsKey("entId")) {
            query.put("entId", helpService.getEnterpriseId());
        }

        List<TransportLoginWx> list = selectByQuery(query);
        if (list == null || list.size() == 0) {
            return null;
        }

        return list.get(0);
    }

    //region 根据用户user_id获取用户微信open_id

    /**
     * 根据用户user_id获取用户微信open_id
     *
     * @param userId 用户Id
     * @return openid
     */
    public String getWxOpenIdByUserId(Integer userId, Integer entId) {

        if (userId == null || userId <= 0) {
            return null;
        }

        if (entId == null || entId <= 0) {
            entId = helpService.getEnterpriseId();
        }

        //1.根据origin_type、user_type和rel_id直接获取公众号openid
        Query query = Query.noPage();
        query.put("originType", 1);    //用户来源：1公众号 2小程序
        query.put("userType", 3);      //用户类型：1管理员 2司机 3会员
        query.put("relId", userId);
        query.put("stopFlag", 0);
        query.put("entId", entId);
        TransportLoginWx dto = selectObjByQuery(query);
        if (dto != null) {
            return dto.getOpenId();
        }

        //2.如果不存在，则根据同样的条件获取小程序的unionid
        Query xcx_query = Query.noPage();
        xcx_query.put("originType", 2);    //用户来源：1公众号 2小程序
        xcx_query.put("userType", 3);      //用户类型：1管理员 2司机 3会员
        xcx_query.put("relId", userId);
        xcx_query.put("stopFlag", 0);
        xcx_query.put("entId", entId);
        TransportLoginWx xcx_dto = selectObjByQuery(xcx_query);
        if (xcx_dto == null) {
            return null;
        }

        //3.根据小程序的unionid再获取公众号的openid
        Query gzh_query = Query.noPage();
        gzh_query.put("originType", 1);    //用户来源：1公众号 2小程序
        gzh_query.put("userType", 3);      //用户类型：1管理员 2司机 3会员
        gzh_query.put("unionId", xcx_dto.getUnionId());
        gzh_query.put("stopFlag", 0);
        gzh_query.put("entId", entId);
        TransportLoginWx gzh_dto = selectObjByQuery(gzh_query);
        if (gzh_dto == null) {
            return null;
        }

        //4.将relid更新到公众号的relid中
        TransportLoginWx update = new TransportLoginWx();
        update.setId(gzh_dto.getId());
        update.setRelId(userId);
        update.setEntId(entId);
        updateInfoById(update);

        //5.返回openid
        return gzh_dto.getOpenId();
    }

    //endregion

    /**
     * 根据条件获取List
     *
     * @param query 查询条件 KV 格式
     * @return 实体对象列表
     */
    public List<TransportLoginWx> selectByQuery(Query query) {
        if (!query.containsKey("deleteFlag")) {
            query.put("deleteFlag", 0);
        }
        if (!query.containsKey("entId")) {
            query.put("entId", helpService.getEnterpriseId());
        }

        return transportLoginWxDao.selectByQuery(query);
    }

    /**
     * 根据条件获取记录总数
     *
     * @param query 查询条件 KV 格式
     * @return 总记录数
     */
    public Long countByQuery(Query query) {
        if (!query.containsKey("deleteFlag")) {
            query.put("deleteFlag", 0);
        }
        if (!query.containsKey("entId")) {
            query.put("entId", helpService.getEnterpriseId());
        }

        return transportLoginWxDao.countByQuery(query);
    }

    /**
     * 根据ID删除记录信息
     *
     * @param id 主键id
     * @return True or False
     */
    public Boolean deleteById(Integer id) {
        return transportLoginWxDao.deleteById(id, helpService.getEnterpriseId());
    }

    //根据用户user_id获取用户微信open_id
    public String getOpenidByRelid(Integer userType, Integer relId, Integer entId) {
        Query query = Query.noPage();
        query.put("entId", entId);
        query.put("userType", userType);
        query.put("relId", relId);
        query.put("stopFlag", 0);
        TransportLoginWx obj = selectObjByQuery(query);
        return obj == null ? "" : obj.getOpenId();
    }
}